package com.sanshengshui.netty.oioAndnio;

import java.io.IOException;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.charset.Charset;

/**
 * @author zyl
 * @description
 * @since 2024/7/17
 */

public class PlainOioServer {

    public static void serve(int port) throws IOException {
        //创建了一个服务器套接字 (ServerSocket)，并绑定到指定的端口（port）
        final ServerSocket socket = new ServerSocket(port);
        try {
            //服务器进入了一个无限循环（for(;;)），等待客户端的连接请求
            for (;;) {
                //socket.accept() 方法会阻塞，直到有客户端连接到服务器
                //连接成功后，返回一个表示客户端连接的 Socket 对象 (clientSocket)。然后，服务器打印出接受到连接的信息
                final Socket clientSocket = socket.accept();
                System.out.println(
                        "Accepted connection from " + clientSocket);
                //启动新线程处理客户端请求
                //每次有新的客户端连接时，服务器会启动一个新的线程来处理这个连接
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        OutputStream out;
                        try {
                            //获取客户端套接字的输出流 (OutputStream)
                            out = clientSocket.getOutputStream();
                            //向客户端发送一个简单的字符串 "Hi!" 并换行（\r\n），编码为 UTF-8
                            out.write("Hi!\r\n".getBytes(
                                    Charset.forName("UTF-8")));
                            //使用 flush() 方法将数据立即发送出去
                            out.flush();
                            //关闭客户端套接字
                            clientSocket.close();
                        }
                        catch (IOException e) {
                            e.printStackTrace();
                        }
                        finally {
                            try {
                                clientSocket.close();
                            }
                            catch (IOException ex) {
                                // ignore on close
                            }
                        }
                    }
                }).start();
            }
        }
        catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        try {
            serve(8080);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}
